{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import sys as sys\n",
    "#reload(sys)\n",
    "#sys.setdefaultencoding('utf-8')\n",
    "from sklearn.cluster import KMeans\n",
    "from sklearn import feature_extraction\n",
    "from sklearn.feature_extraction.text import TfidfTransformer\n",
    "from sklearn.feature_extraction.text import CountVectorizer\n",
    "\n",
    "import matplotlib.pyplot as plt \n",
    "from matplotlib.font_manager import FontProperties \n",
    "from sklearn.cluster import KMeans \n",
    "from scipy.spatial.distance import cdist \n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "vectorize the input documents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def tfidf_vector(corpus_path):\n",
    "    corpus_train=[]\n",
    "    #利用train-corpus提取特征\n",
    "    target_train=[]\n",
    "    for line in open(corpus_path):\n",
    "        line=line.strip().split('\\t')\n",
    "        if len(line)==2:\n",
    "            words=line[1]\n",
    "            category=line[0]\n",
    "            target_train.append(category)\n",
    "            corpus_train.append(words)\n",
    "    print (\"build train-corpus done!!\")\n",
    "    count_v1= CountVectorizer(max_df=0.4,min_df=0.01)\n",
    "    counts_train = count_v1.fit_transform(corpus_train)  \n",
    "    \n",
    "    word_dict={}\n",
    "    for index,word in enumerate(count_v1.get_feature_names()):\n",
    "        word_dict[index]=word\n",
    "    \n",
    "    print (\"the shape of train is \")\n",
    "    print (repr(counts_train.shape))\n",
    "    tfidftransformer = TfidfTransformer()\n",
    "    tfidf_train = tfidftransformer.fit(counts_train).transform(counts_train)\n",
    "    return tfidf_train,word_dict"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "topic cluster"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def cluster_kmeans(tfidf_train,word_dict,cluster_docs,cluster_keywords,num_clusters):#K均值分类\n",
    "    f_docs=open(cluster_docs,'w+')\n",
    "    km = KMeans(n_clusters=num_clusters)\n",
    "    km.fit(tfidf_train)\n",
    "    clusters = km.labels_.tolist()\n",
    "    cluster_dict={}\n",
    "    order_centroids = km.cluster_centers_.argsort()[:, ::-1]      \n",
    "    doc=1\n",
    "    for cluster in clusters:\n",
    "        f_docs.write(str(str(doc))+','+str(cluster)+'\\n')\n",
    "        doc+=1\n",
    "        if cluster not in cluster_dict:\n",
    "            cluster_dict[cluster]=1\n",
    "        else:\n",
    "            cluster_dict[cluster]+=1\n",
    "    f_docs.close()\n",
    "    cluster=1\n",
    "    \n",
    "    f_clusterwords = open(cluster_keywords,'w+')\n",
    "    for ind in order_centroids: # 每个聚类选 50 个词\n",
    "        words=[]\n",
    "        for index in ind[:50]:\n",
    "            words.append(word_dict[index])\n",
    "        print (cluster),(','.join(words))\n",
    "        f_clusterwords.write(str(cluster)+'\\t'+','.join(words)+'\\n')\n",
    "        cluster+=1\n",
    "        print ('*****'*5)\n",
    "    f_clusterwords.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "select the best cluster num"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def best_kmeans(tfidf_matrix,word_dict):  \n",
    "    K = range(1, 10) \n",
    "    meandistortions = [] \n",
    "    for k in K: \n",
    "        print (k),('****'*5)\n",
    "        kmeans = KMeans(n_clusters=k) \n",
    "        kmeans.fit(tfidf_matrix)    \n",
    "        meandistortions.append(sum(np.min(cdist(tfidf_matrix.toarray(), kmeans.cluster_centers_, 'euclidean'), axis=1)) / tfidf_matrix.shape[0]) \n",
    "    plt.plot(K, meandistortions, 'bx-')\n",
    "    plt.grid(True) \n",
    "    plt.xlabel('Number of clusters') \n",
    "    plt.ylabel('Average within-cluster sum of squares') \n",
    "    plt.title('Elbow for Kmeans clustering')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Main启动"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "build train-corpus done!!\n",
      "the shape of train is \n",
      "(1610, 362)\n",
      "1\n",
      "2\n",
      "3\n",
      "4\n",
      "5\n",
      "6\n",
      "7\n",
      "8\n",
      "9\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "*************************\n",
      "2\n",
      "*************************\n",
      "3\n",
      "*************************\n",
      "4\n",
      "*************************\n",
      "5\n",
      "*************************\n",
      "6\n",
      "*************************\n",
      "7\n",
      "*************************\n"
     ]
    }
   ],
   "source": [
    "corpus_train = \"corpus_train.txt\"\n",
    "cluster_docs = \"cluster_result_document.txt\"\n",
    "cluster_keywords = \"cluster_result_keyword.txt\"\n",
    "num_clusters = 7\n",
    "tfidf_train,word_dict=tfidf_vector(corpus_train)\n",
    "best_kmeans(tfidf_train,word_dict)\n",
    "cluster_kmeans(tfidf_train,word_dict,cluster_docs,cluster_keywords,num_clusters)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
